package com.chandon.T03_method_reference;

import com.chandon.common.Cv;
import com.chandon.common.Role;
import com.chandon.T03_method_reference.function.MethodWithoutArgsReturnFunction;

import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * 对象方法的引用(很少用)
 * <p>
 * 抽象方法的第一个参数类型，是实例方法的类型；抽象方法的剩余参数可以当做实例方法的参数；
 * 且可以通过实例方法调用实现，就可以使用对象方法引用。
 * <p>
 * 人话：某个方法实现了函数功能，且方法所在类的类名、方法的参数类型、正好能与函数接口上的参数一一对应，可简写为方法引用形式。、
 *
 * @author Dong
 * @version 1.0
 * @date 2021-04-16 21:33
 */

public class T03_ClassMethodRef {
    public static void main(String[] args) {

        // 传统
        new Cv().fun();


        MethodWithoutArgsReturnFunction cvMethodWithoutArgsReturnFunction = () -> new Cv().fun();


        Consumer<Cv> cvConsumer = Cv::fun;
        Consumer<Cv> cvConsumerLambda = cv -> new Cv().fun();

        cvConsumer.accept(new Cv());


        BiConsumer<Cv, String> biConsumer = Cv::name;
        BiConsumer<Cv, String> biConsumerLambda = (cv, s) -> {
            new Cv().name("asa");
        };
        biConsumer.accept(new Cv(), "asami");



        Function<Cv, Integer> CvFunction = Cv::age;
        Function<Cv, Integer> CvFunctionLambda = (age)-> {
           return new Cv().age();
        };

        CvFunction.apply(new Cv());



        BiFunction<Cv, String, Role> roleBifunction = Cv::getRole;
        //lambda写法
        BiFunction<Cv, String, Role> roleBifunctionLambda = (cv, s) -> {
            return new Cv().getRole("asa");
        };

        Role role = roleBifunction.apply(new Cv(), "asami");
        System.out.println(role);


    }

}
